package ejercicios.ejercicio7;

//NOTA: Según el enunciado, puede haber varios coches en el puente
//	simuláneamente, lo que se representa en las variables Número_Subiendo
//	y Número_Bajando. Lo que no puede haber son coches subiendo y bajando
//	simultaneamente. Si sílo pudiera haber un coche en el puente, se
//	podría representar mediante una variable que indicara si el puente
//	está ocupado y con otra que indique el sentido de marcha actual
public class gestorPuente {

    //N�mero de coches subiendo o bajando
    private int límiteEnEspera = 8; // Lo puede dar el constructor
    private int númeroBajando = 0;
    private int númeroEsperandoBajar = 0;
    private int númeroSubiendo = 0;
    private int númeroEsperandoSubir = 0;

    public synchronized void entrarSubiendo(int idCoche) throws InterruptedException {

        númeroEsperandoSubir++;
        System.out.println("++++ El coche que sube " + idCoche + " intenta entrar en el puente " + númeroEsperandoSubir);

        while (númeroBajando > 0 || (númeroEsperandoBajar > límiteEnEspera && númeroEsperandoSubir < límiteEnEspera)) {
            wait();
        }

        númeroEsperandoSubir--;
        númeroSubiendo++;

        System.out.println("++++ El coche que sube " + idCoche + " entra en el puente " + númeroEsperandoSubir + " " + númeroSubiendo);

    }

    public synchronized void salirSubiendo(int idCoche) {
        númeroSubiendo--;
        System.out.println("++++ El coche que sube " + idCoche + " sale del puente " + númeroEsperandoSubir + " " + númeroSubiendo);

        if (númeroSubiendo == 0 || (númeroSubiendo > 0 && (númeroEsperandoSubir > 0 
                && (númeroEsperandoSubir > límiteEnEspera || númeroEsperandoBajar < límiteEnEspera)))) {
            notifyAll();
        }
    }

    public synchronized void entrarBajando(int idCoche)
            throws InterruptedException {

        númeroEsperandoBajar++;
        System.out.println("---- El coche que baja " + idCoche + " intenta entrar en el puente " + númeroEsperandoBajar);

        while (númeroSubiendo > 0 || (númeroEsperandoSubir > límiteEnEspera)) {
            wait();
        }

        númeroEsperandoBajar--;
        númeroBajando++;

        System.out.println("---- El coche que baja " + idCoche + " entra en el puente " + númeroEsperandoBajar + " " + númeroBajando);
    }

    public synchronized void salirBajando(int idCoche) {
        númeroBajando--;
        System.out.println("---- El coche que baja " + idCoche + " sale del puente " + númeroEsperandoBajar + " " + númeroBajando);

        // No ejecuto notifyAll si no es necesario
        if (númeroBajando == 0 || (númeroBajando > 0 && númeroEsperandoBajar > 0
                && númeroEsperandoSubir < límiteEnEspera)) {
            notifyAll();
        }
    }

}
